package com.xxpt.coder;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.apache.commons.lang3.StringUtils;

import java.util.HashMap;
import java.util.Map;

/**
 * mybatis-plus 生成器
 * @Author masl - 2023/2/22 下午4:01
 */
public class MybatisPlusCreater {
    public static void main(String[] args) {
        Map<String, String> tablesMap = new HashMap<>();
        tablesMap.put("user", "");

        Conf conf = Conf.builder()
                .outPath("/home/cnmmmss/codes/")// 代码生成文件夹路径
                .basePackageName("com.xxpt")// 顶级包名
                //.setSubPackageName("sys")// 子包名
                .company("xxxx")// 公司
                .author("masl")// 当前操作人
                .templeteDirName("cloverCode")// 模板文件夹名称
                // -----------数据库相关设置-----------
                .dbDriver("com.mysql.cj.jdbc.Driver")
                .dbUrl("jdbc:mysql://127.0.0.1:3306/xxpt")
                .dbUserNa("root")
                .dbPwd("123456")
                .build();

        //获取代码生成器对象
        AutoGenerator autoGenerator = new AutoGenerator();

        //设置数据库相关配置
        DataSourceConfig dataSource = new DataSourceConfig();
        dataSource.setDriverName(conf.getDbDriver());
        dataSource.setUrl(conf.getDbUrl());
        dataSource.setUsername(conf.getDbUserNa());
        dataSource.setPassword(conf.getDbPwd());
        autoGenerator.setDataSource(dataSource);

        //设置全局配置
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setOutputDir(conf.getOutPath());//设置代码输出位置，否则默认输出到D://目录下
        globalConfig.setOpen(false);//设置生成完毕后是否打开生成代码的目录，一般选择false，不需要打开目录
        globalConfig.setAuthor(conf.getAuthor());//作者名字，会在注释中添加作者名字
        globalConfig.setFileOverride(true);//是否覆盖原始生成的文件，选择true后，生成时若原来已有相同文件会自动覆盖，谨慎操作
        globalConfig.setMapperName("%sMapper");//设置数据层接口名，%s为占位符，指代模块名称，默认为"%sMapper"
        globalConfig.setIdType(IdType.AUTO);//设置id生成策略
        autoGenerator.setGlobalConfig(globalConfig);

        //设置包名配置
        PackageConfig packageConfig = new PackageConfig();
        packageConfig.setParent(conf.getBasePackageName());//设置生成的包名，默认为"com.baomidou"
        //packageConfig.setModuleName(conf.getSubPackageName());
        packageConfig.setEntity("model");//设置实体类包名，默认为entity
        packageConfig.setMapper("mapper");//设置数据层包名，默认为mapper
        autoGenerator.setPackageInfo(packageConfig);

        for (String tb : tablesMap.keySet()) {
            //策略设置
            StrategyConfig strategyConfig = new StrategyConfig();
            strategyConfig.setInclude(tb);//设置参与生成的表名，可填一个或多个
            String tbPrefix = tablesMap.get(tb);
            if(StringUtils.isNotBlank(tbPrefix)) {
                strategyConfig.setTablePrefix(tbPrefix);//设置数据库表名的前缀名称，设置后会省略该前缀
            }
            strategyConfig.setRestControllerStyle(false);//设置是否启用Rest风格
            //strategyConfig.setLogicDeleteFieldName("deleted");//设置逻辑删除字段名，没有就不填
            strategyConfig.setEntityLombokModel(true);//设置是否启用Lombok
            strategyConfig.setEntitySerialVersionUID(true);
            // 包的命名规则，使用驼峰规则
            strategyConfig.setNaming(NamingStrategy.underline_to_camel);
            // 列的名称，使用驼峰规则
            strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel);
            // 驼峰命名
            strategyConfig.setControllerMappingHyphenStyle(true);
            // 驼峰命名
            strategyConfig.setControllerMappingHyphenStyle(true);
            autoGenerator.setStrategy(strategyConfig);

            //执行生成操作
            autoGenerator.execute();
        }
    }
}
